package com.quanxi.qxaimain.service.SDQueryService;

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 大数据查询结果集处理抽象类
 * @Author lyx
 * @create 2022/11/28 17:43
 */

public abstract  class SDQueryResultHandler implements ResultHandler<Map> {
    private final static Logger logger = LoggerFactory.getLogger(SDQueryResultHandler.class);

    // 这是每一个批处理查询的数量
    public  int batchSize = 1000;
    //初始值
    public int size=0;
    // 存储每批数据的临时容器
    public List<Map> list = new ArrayList<Map>();
    // public List<Map<String, Object>> list = new ArrayList();

/**
 * getResultObject：获取当前行的结果
 * getResultCount：获取当前结果到第几行了
 * isStopped：判断是否需要停止遍历结果集
 * stop：停止遍历结果集
 * */

    public void handleResult(ResultContext<? extends Map> resultContext) {
        // 这里获取流式查询每次返回的单条结果

        Map map = resultContext.getResultObject();
        Map   result=  singlehandle(map);//处理每条数据
        list.add(result);
        size++;
        if (size == batchSize) {

            logger.info("本批次处理数据量 :{}",size );
            handle();
            logger.info("已经处理数量：",resultContext.getResultCount());
        }
    }

    //批处理抽象方法
    public abstract void handle();

    //单个处理抽象方法
    public abstract  Map  singlehandle(Map map);

    //处理最后一批不到 batchSize(查询设定的阀值)的数据
    public void lastSDHandle() {
        logger.info("最后批次处理数据量 :{}",size );
        handle();
    }

    //设置阀值 默认1000
    public void setBatchSize(int batchSize) {
        this.batchSize = batchSize;
    }

    //抽象方法，提供给子类进行实现
    public abstract void tryFetchData();

    // 真正开始流处理 调用回调tryFetchData()
    public void start(){
        tryFetchData();
    }


}